test <- all_rawdata %>% 
  filter(FileName == "Megan-2019_03_06_Courtship-DsxVglutTNT_Male_1234_2") %>% 
  filter(Id == 36) 
gg_color_hue(4)
[1] "#F8766D" "#7CAE00" "#00BFC4" "#C77CFF"

calculates relative y value based on data from feat.mat

calculate_yrel <- function(theta,dist){ yrel=dist*cos(theta) return(yrel) }

function calculates xrel based on track.mat file

in the case of the male, right and left wing angles were swapped, so in

that case, the names of the arguments to the functions don’t make sense.

This is due to ‘ipsi’ and ‘contra’ having a different meaning when male

position relative to female is examined.

determining whether ipsi or contralateral wing is extended.

calculate_xrel <- function(ori,xmale,xfemale,right_angle,left_angle,yrel,ppm){ xmale_mm=xmale/ppm; xfemale_mm=xfemale/ppm;

if (abs(right_angle)>abs(left_angle)) { xrel = (xfemale_mm - (cos(ori)yrel+xmale_mm))/(sin(ori)) } else { xrel = -(xfemale_mm - (cos(ori)yrel+xmale_mm))/(sin(ori)) }

if (xrel >20 | xrel<-20) { xrel=NA } }

test$dist_to_other__mm[1]
[1] 17.92103
test$dist_to_other__mm[2]
[1] 17.92103
test$facing_angle__rad[1]
[1] 1.410952
test$facing_angle__rad[2]
[1] 1.208154
test <- test %>%
  mutate(rel_x = ,
         rel_y = )
unique(new_data$FileName)
[1] "Megan-2019_03_06_Courtship-DsxVglutTNT_Male_123_3"  "Megan-2019_03_06_Courtship-DsxVglutTNT_Male_1234_2"
new_data <- new_data %>% 
  filter(FileName!="Megan-2019_03_06_Courtship-DsxVglutTNT_Male_1234_2")
unique(new_data$FileName)
[1] "Megan-2019_03_06_Courtship-DsxVglutTNT_Male_123_3"
new_data %>% 
  filter(genotype!="CS female") %>% 
  filter(rel_y_other > -20 & rel_y_other < 20) %>% 
  filter(rel_x_other > -20 & rel_x_other < 20) %>% 
  ggplot(aes(x=rel_x_other,y=rel_y_other)) +
  geom_point() +
  coord_fixed()

new_data %>% 
  filter(genotype!="CS female") %>%
  filter(dist_to_other__mm > 2) %>% 
  filter(rel_y_other > -20 & rel_y_other < 20) %>% 
  filter(rel_x_other > -20 & rel_x_other < 20) %>% 
  ggplot(aes(x=rel_x_other,y=rel_y_other)) +
  geom_bin2d(bins = c(100,100)) +
  # xlim(0,2*pi) +
  # ylim(0,10) + 
  scale_fill_continuous(type = "viridis",limits = c(10,1000),na.value = "white") +
  # theme_void() +
  coord_fixed()

new_data %>% 
  filter(genotype!="CS female") %>%
  filter(dist_to_other__mm > 2) %>% 
  #filter(rel_y_other > -20 & rel_y_other < 20) %>% 
  #filter(rel_x_other > -20 & rel_x_other < 20) %>% 
  ggplot(aes(x=rel_x_other,y=rel_y_other)) +
  geom_bin2d(bins = c(100,100)) +
  # xlim(0,2*pi) +
  # ylim(0,10) + 
  scale_fill_continuous(type = "viridis",limits = c(0,1000),na.value = "white") #+

  # theme_void() +
  #coord_fixed()

new_data %>% 
  filter(genotype!="CS female") %>%
  filter(dist_to_other__mm > 2) %>% 
  filter(rel_x_other < -20 | rel_x_other > 20) %>% 
  select(FileName,Arena,Id,Frame,dist_to_other__mm,facing_angle__rad,ori__rad,pos_x__px,pos_y__px,rel_x_other,rel_y_other)

(xfemale_mm - (cos(ori)*yrel+xmale_mm))/(sin(ori))

new_data %>% 
  filter(genotype!="CS female") %>%
  filter(dist_to_other__mm > 2) %>% 
  filter(rel_x_other < -20 | rel_x_other > 20) %>% 
  select(Arena,Id,Frame,dist_to_other__mm,facing_angle__rad,ori__rad,pos_x__px,pos_y__px,rel_x_other,rel_y_other) %>% 
  mutate(cos_ori = cos(ori__rad),
         sin_ori = sin(ori__rad))

p1 <- new_data %>% 
  filter(genotype!="CS female") %>%
  filter(dist_to_other__mm > 2) %>% 
  filter(rel_x_other < -20 | rel_x_other > 20) %>% 
  ggplot(aes(x=FileName,y=ori__rad))+geom_point()+ylim(-3.3,-2.8)
p2 <- new_data %>% 
  filter(genotype!="CS female") %>%
  filter(dist_to_other__mm > 2) %>% 
  filter(rel_x_other < -20 | rel_x_other > 20) %>% 
  ggplot(aes(x=FileName,y=ori__rad))+geom_point()+ylim(-0.6,0.6)
p3 <- new_data %>% 
  filter(genotype!="CS female") %>%
  filter(dist_to_other__mm > 2) %>% 
  filter(rel_x_other < -20 | rel_x_other > 20) %>% 
  ggplot(aes(x=FileName,y=ori__rad))+geom_point()+ylim(2.8,3.2)
ggarrange(plotlist = list(p1,p2,p3),
          ncol = 3,
          nrow = 1)
Removed 653 rows containing missing values (geom_point).Removed 442 rows containing missing values (geom_point).Removed 621 rows containing missing values (geom_point).

new_data %>% 
  filter(genotype!="CS female") %>%
  filter(dist_to_other__mm > 2) %>% 
  filter(rel_y_other < -20 | rel_y_other > 20)

temp2 %>% 
  filter(genotype!="CS female") %>%
  filter(dist_to_other__mm > 2) %>% 
  #filter(rel_y_other > -20 & rel_y_other < 20) %>% 
  #filter(rel_x_other > -20 & rel_x_other < 20) %>% 
  ggplot(aes(x=rel_x_other,y=rel_y_other)) +
  geom_bin2d(bins = c(100,100)) +
  # xlim(0,2*pi) +
  # ylim(0,10) + 
  scale_fill_continuous(type = "viridis",limits = c(0,1000),na.value = "white") #+

  # theme_void() +
  #coord_fixed()

Proportion time in sector and within 10mm

There were 40 warnings (use warnings() to see them)

Proportion time in sector and within 10mm

Warning messages:
1: Unknown or uninitialised column: 'dist_to_other__mm'. 
2: Unknown or uninitialised column: 'dist_to_other__mm'. 
3: Unknown or uninitialised column: 'dist_to_other__mm'. 
4: Unknown or uninitialised column: 'dist_to_other__mm'. 
5: Unknown or uninitialised column: 'facing_angle__rad'. 
6: Unknown or uninitialised column: 'facing_angle__rad'. 
7: Unknown or uninitialised column: 'facing_angle__rad'. 
8: Unknown or uninitialised column: 'facing_angle__rad'. 



There were 24 warnings (use warnings() to see them)



colour=c(ifelse(rollavg_dist_to_other>2.5,gg_color_hue(2)[2],gg_color_hue(2)[1]))

There were 24 warnings (use warnings() to see them)

There were 16 warnings (use warnings() to see them)

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCgoKCgoKCmBgYHtyfQp0ZXN0IDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoRmlsZU5hbWUgPT0gIk1lZ2FuLTIwMTlfMDNfMDZfQ291cnRzaGlwLURzeFZnbHV0VE5UX01hbGVfMTIzNF8yIikgJT4lIAogIGZpbHRlcihJZCA9PSAzNikgCmBgYAoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQp0ZXN0ICU+JSAKICBzbGljZSh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOndoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pKSAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT0td2luZ19sX2FuZ19fcmFkLCBjb2xvdXIgPSAiI0Y4NzY2RCIpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PXdpbmdfcl9hbmdfX3JhZCwgY29sb3VyID0gIiMwMEJGQzQiKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT1jKGlmZWxzZShiaW5fbWF4X3dpbmc9PTEsMS42LC0xKSkpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PWMoaWZlbHNlKG1heF93aW5nX2FuZ19fcmFkPj0oMzUqcGkvMTgwKSwxLjgsLTEpKSkpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9YyhpZmVsc2UoV2luZ0dlc3R1cmU9PTEsV2luZ0dlc3R1cmUrMSxXaW5nR2VzdHVyZS0xKSkpKSArCiAgICB5bGltKDAsMi4yKQpgYGAKCgoKYGBge3J9CmdnX2NvbG9yX2h1ZSg0KQpgYGAKCgoKCiMgY2FsY3VsYXRlcyByZWxhdGl2ZSB5IHZhbHVlIGJhc2VkIG9uIGRhdGEgZnJvbSBmZWF0Lm1hdApjYWxjdWxhdGVfeXJlbCA8LSBmdW5jdGlvbih0aGV0YSxkaXN0KXsKICB5cmVsPWRpc3QqY29zKHRoZXRhKQogIHJldHVybih5cmVsKQp9CgoKCiMgZnVuY3Rpb24gY2FsY3VsYXRlcyB4cmVsIGJhc2VkIG9uIHRyYWNrLm1hdCBmaWxlCiMgaW4gdGhlIGNhc2Ugb2YgdGhlIG1hbGUsIHJpZ2h0IGFuZCBsZWZ0IHdpbmcgYW5nbGVzIHdlcmUgc3dhcHBlZCwgc28gaW4KIyB0aGF0IGNhc2UsIHRoZSBuYW1lcyBvZiB0aGUgYXJndW1lbnRzIHRvIHRoZSBmdW5jdGlvbnMgZG9uJ3QgbWFrZSBzZW5zZS4KIyBUaGlzIGlzIGR1ZSB0byAnaXBzaScgYW5kICdjb250cmEnIGhhdmluZyBhIGRpZmZlcmVudCBtZWFuaW5nIHdoZW4gbWFsZQojIHBvc2l0aW9uIHJlbGF0aXZlIHRvIGZlbWFsZSBpcyBleGFtaW5lZC4KIyBkZXRlcm1pbmluZyB3aGV0aGVyIGlwc2kgb3IgY29udHJhbGF0ZXJhbCB3aW5nIGlzIGV4dGVuZGVkLgpjYWxjdWxhdGVfeHJlbCA8LSBmdW5jdGlvbihvcmkseG1hbGUseGZlbWFsZSxyaWdodF9hbmdsZSxsZWZ0X2FuZ2xlLHlyZWwscHBtKXsKICB4bWFsZV9tbT14bWFsZS9wcG07CiAgeGZlbWFsZV9tbT14ZmVtYWxlL3BwbTsKICAKICBpZiAoYWJzKHJpZ2h0X2FuZ2xlKT5hYnMobGVmdF9hbmdsZSkpIHsKICAgIHhyZWwgPSAoeGZlbWFsZV9tbSAtIChjb3Mob3JpKSp5cmVsK3htYWxlX21tKSkvKHNpbihvcmkpKQogIH0gZWxzZSB7CiAgICB4cmVsID0gLSh4ZmVtYWxlX21tIC0gKGNvcyhvcmkpKnlyZWwreG1hbGVfbW0pKS8oc2luKG9yaSkpCiAgfQogIAogIGlmICh4cmVsID4yMCB8IHhyZWw8LTIwKSB7CiAgICB4cmVsPU5BCiAgfQp9CgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KdGVzdCAlPiUgCiAgc2xpY2Uod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTp3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSkgJT4lIAogIGdncGxvdChhZXMoeD1GcmFtZSkpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9cG9zX3lfX3B4LCBjb2xvdXIgPSAiI0Y4NzY2RCIpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PXBvc194X19weCwgY29sb3VyID0gIiM2MTlDRkYiKSkKCmBgYAoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQp0ZXN0ICU+JSAKICBzbGljZSh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOndoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pKSAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT1kaXN0X3RvX290aGVyX19tbSwgY29sb3VyID0gIiNGODc2NkQiKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT0oZGlzdF90b19vdGhlcl9fbW0qY29zKGZhY2luZ19hbmdsZV9fcmFkKSksIGNvbG91ciA9ICIjMDBCQTM4IikpCgpgYGAKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KdGVzdCAlPiUgCiAgc2xpY2Uod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTp3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSkgJT4lIAogIGdncGxvdChhZXMoeD1GcmFtZSkpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9ZGlzdF90b19vdGhlcl9fbW0sIGNvbG91ciA9ICIjRjg3NjZEIikpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9KAogICAgICAKICAgICAgKHhmZW1hbGVfbW0gLSAoY29zKG9yaSkqeXJlbCt4bWFsZV9tbSkpLyhzaW4ob3JpKSkKICAgICAgCiAgICApLCBjb2xvdXIgPSAiIzAwQkEzOCIpKQoKYGBgCgoKCgpgYGB7cn0KdGVzdCA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoQXJlbmEgPT0gMSkgJT4lIAogIGZpbHRlcihGcmFtZSA9PSAxKQp0ZXN0CmBgYAoKCgpgYGB7cn0KdGVzdFsxLF0KYGBgCgoKYGBge3J9CnRlc3RbMixdCmBgYAoKCmBgYHtyfQp0ZXN0JGRpc3RfdG9fb3RoZXJfX21tWzFdCnRlc3QkZGlzdF90b19vdGhlcl9fbW1bMl0KYGBgCgoKYGBge3J9CnRlc3QkZmFjaW5nX2FuZ2xlX19yYWRbMV0KdGVzdCRmYWNpbmdfYW5nbGVfX3JhZFsyXQpgYGAKCgpgYGB7cn0KdGVzdCA8LSB0ZXN0ICU+JQogIG11dGF0ZShyZWxfeCA9ICwKICAgICAgICAgcmVsX3kgPSApCmBgYAoKCgoKCgpgYGB7cn0KbmV3X2RhdGEKYGBgCgoKYGBge3J9CnVuaXF1ZShuZXdfZGF0YSRGaWxlTmFtZSkKbmV3X2RhdGEgPC0gbmV3X2RhdGEgJT4lIAogIGZpbHRlcihGaWxlTmFtZSE9Ik1lZ2FuLTIwMTlfMDNfMDZfQ291cnRzaGlwLURzeFZnbHV0VE5UX01hbGVfMTIzNF8yIikKdW5pcXVlKG5ld19kYXRhJEZpbGVOYW1lKQpgYGAKCgoKCgoKCmBgYHtyfQpuZXdfZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlIT0iQ1MgZmVtYWxlIikgJT4lIAogIGZpbHRlcihyZWxfeV9vdGhlciA+IC0yMCAmIHJlbF95X290aGVyIDwgMjApICU+JSAKICBmaWx0ZXIocmVsX3hfb3RoZXIgPiAtMjAgJiByZWxfeF9vdGhlciA8IDIwKSAlPiUgCiAgZ2dwbG90KGFlcyh4PXJlbF94X290aGVyLHk9cmVsX3lfb3RoZXIpKSArCiAgZ2VvbV9wb2ludCgpICsKICBjb29yZF9maXhlZCgpCmBgYAoKCgoKCgpgYGB7cn0KbmV3X2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSE9IkNTIGZlbWFsZSIpICU+JQogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIocmVsX3lfb3RoZXIgPiAtMjAgJiByZWxfeV9vdGhlciA8IDIwKSAlPiUgCiAgZmlsdGVyKHJlbF94X290aGVyID4gLTIwICYgcmVsX3hfb3RoZXIgPCAyMCkgJT4lIAogIGdncGxvdChhZXMoeD1yZWxfeF9vdGhlcix5PXJlbF95X290aGVyKSkgKwogIGdlb21fYmluMmQoYmlucyA9IGMoMTAwLDEwMCkpICsKICAjIHhsaW0oMCwyKnBpKSArCiAgIyB5bGltKDAsMTApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygxMCwxMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICAjIHRoZW1lX3ZvaWQoKSArCiAgY29vcmRfZml4ZWQoKQpgYGAKCgoKYGBge3J9Cm5ld19kYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUhPSJDUyBmZW1hbGUiKSAlPiUKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgI2ZpbHRlcihyZWxfeV9vdGhlciA+IC0yMCAmIHJlbF95X290aGVyIDwgMjApICU+JSAKICAjZmlsdGVyKHJlbF94X290aGVyID4gLTIwICYgcmVsX3hfb3RoZXIgPCAyMCkgJT4lIAogIGdncGxvdChhZXMoeD1yZWxfeF9vdGhlcix5PXJlbF95X290aGVyKSkgKwogIGdlb21fYmluMmQoYmlucyA9IGMoMTAwLDEwMCkpICsKICAjIHhsaW0oMCwyKnBpKSArCiAgIyB5bGltKDAsMTApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygwLDEwMDApLG5hLnZhbHVlID0gIndoaXRlIikgIysKICAjIHRoZW1lX3ZvaWQoKSArCiAgI2Nvb3JkX2ZpeGVkKCkKYGBgCgoKYGBge3J9Cm5ld19kYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUhPSJDUyBmZW1hbGUiKSAlPiUKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgI2ZpbHRlcihyZWxfeV9vdGhlciA+IC0yMCAmIHJlbF95X290aGVyIDwgMjApICU+JSAKICAjZmlsdGVyKHJlbF94X290aGVyID4gLTIwICYgcmVsX3hfb3RoZXIgPCAyMCkgJT4lIAogIGdncGxvdChhZXMoeD1yZWxfeF9vdGhlcix5PXJlbF95X290aGVyKSkgKwogIGdlb21fYmluMmQoYmlucyA9IGMoMTAwLDEwMCkpICsKICAgeGxpbSgwLDIqcGkpICsKICAjIHlsaW0oMCwxMCkgKyAKICBnZW9tX3BvaW50KCkKICAjIHRoZW1lX3ZvaWQoKSArCiAgI2Nvb3JkX2ZpeGVkKCkKYGBgCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD04fQpwMSA8LSBuZXdfZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlIT0iQ1MgZmVtYWxlIikgJT4lCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihyZWxfeV9vdGhlciA+IC0yMCAmIHJlbF95X290aGVyIDwgMjApICU+JSAKICBmaWx0ZXIocmVsX3hfb3RoZXIgPiAtMjAgJiByZWxfeF9vdGhlciA8IDIwKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWlmZWxzZShyZWxfeF9vdGhlcj49MCxyZWxfeF9vdGhlciwtcmVsX3hfb3RoZXIpLHk9cmVsX3lfb3RoZXIpKSArCiAgZ2VvbV9iaW4yZChiaW5zID0gYygxMDAsMTAwKSkgKwogIHhsaW0oLTIwLDIwKSArCiAgeWxpbSgtMjAsMjApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygwLDEwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogICMgdGhlbWVfdm9pZCgpICsKICBjb29yZF9maXhlZCgpCnAyIDwtIG5ld19kYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUhPSJDUyBmZW1hbGUiKSAlPiUKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKHJlbF95X290aGVyID4gLTIwICYgcmVsX3lfb3RoZXIgPCAyMCkgJT4lIAogIGZpbHRlcihyZWxfeF9vdGhlciA+IC0yMCAmIHJlbF94X290aGVyIDwgMjApICU+JSAKICBnZ3Bsb3QoYWVzKHg9ZmFjaW5nX2FuZ2xlX19yYWQsIHk9ZGlzdF90b19vdGhlcl9fbW0pKSArCiAgZ2VvbV9iaW4yZChiaW5zID0gYygxNTAsNTApKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsMjApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygwLDEwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogICMgdGhlbWVfdm9pZCgpICsKICBjb29yZF9wb2xhcigpCgpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyKSwKICAgICAgICAgIGxhYmVscyA9IGMoInJlbCBwb3MiLCJwb2xhciIpLAogICAgICAgICAgaGp1c3QgPSAtMC4yLAogICAgICAgICAgbmNvbCA9IDIsCiAgICAgICAgICBucm93ID0gMSkKCgpgYGAKCgoKCgpgYGB7cn0KbmV3X2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSE9IkNTIGZlbWFsZSIpICU+JQogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIocmVsX3hfb3RoZXIgPCAtMjAgfCByZWxfeF9vdGhlciA+IDIwKSAlPiUgCiAgc2VsZWN0KEZpbGVOYW1lLEFyZW5hLElkLEZyYW1lLGRpc3RfdG9fb3RoZXJfX21tLGZhY2luZ19hbmdsZV9fcmFkLG9yaV9fcmFkLHBvc194X19weCxwb3NfeV9fcHgscmVsX3hfb3RoZXIscmVsX3lfb3RoZXIpCmBgYAoKCih4ZmVtYWxlX21tIC0gKGNvcyhvcmkpKnlyZWwreG1hbGVfbW0pKS8oc2luKG9yaSkpCgoKYGBge3J9Cm5ld19kYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUhPSJDUyBmZW1hbGUiKSAlPiUKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKHJlbF94X290aGVyIDwgLTIwIHwgcmVsX3hfb3RoZXIgPiAyMCkgJT4lIAogIHNlbGVjdChBcmVuYSxJZCxGcmFtZSxkaXN0X3RvX290aGVyX19tbSxmYWNpbmdfYW5nbGVfX3JhZCxvcmlfX3JhZCxwb3NfeF9fcHgscG9zX3lfX3B4LHJlbF94X290aGVyLHJlbF95X290aGVyKSAlPiUgCiAgbXV0YXRlKGNvc19vcmkgPSBjb3Mob3JpX19yYWQpLAogICAgICAgICBzaW5fb3JpID0gc2luKG9yaV9fcmFkKSkKYGBgCgoKCmBgYHtyfQpuZXdfZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlIT0iQ1MgZmVtYWxlIikgJT4lCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihyZWxfeF9vdGhlciA8IC0yMCB8IHJlbF94X290aGVyID4gMjApICU+JSAKICBnZ3Bsb3QoYWVzKHg9RmlsZU5hbWUseT1vcmlfX3JhZCkpK2dlb21fcG9pbnQoKQpgYGAKCgpgYGB7cn0KcDEgPC0gbmV3X2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSE9IkNTIGZlbWFsZSIpICU+JQogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIocmVsX3hfb3RoZXIgPCAtMjAgfCByZWxfeF9vdGhlciA+IDIwKSAlPiUgCiAgZ2dwbG90KGFlcyh4PUZpbGVOYW1lLHk9b3JpX19yYWQpKStnZW9tX3BvaW50KCkreWxpbSgtMy4zLC0yLjgpCnAyIDwtIG5ld19kYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUhPSJDUyBmZW1hbGUiKSAlPiUKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKHJlbF94X290aGVyIDwgLTIwIHwgcmVsX3hfb3RoZXIgPiAyMCkgJT4lIAogIGdncGxvdChhZXMoeD1GaWxlTmFtZSx5PW9yaV9fcmFkKSkrZ2VvbV9wb2ludCgpK3lsaW0oLTAuNiwwLjYpCnAzIDwtIG5ld19kYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUhPSJDUyBmZW1hbGUiKSAlPiUKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKHJlbF94X290aGVyIDwgLTIwIHwgcmVsX3hfb3RoZXIgPiAyMCkgJT4lIAogIGdncGxvdChhZXMoeD1GaWxlTmFtZSx5PW9yaV9fcmFkKSkrZ2VvbV9wb2ludCgpK3lsaW0oMi44LDMuMikKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMixwMyksCiAgICAgICAgICBuY29sID0gMywKICAgICAgICAgIG5yb3cgPSAxKQpgYGAKCgoKCgoKCmBgYHtyfQpuZXdfZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlIT0iQ1MgZmVtYWxlIikgJT4lCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihyZWxfeV9vdGhlciA8IC0yMCB8IHJlbF95X290aGVyID4gMjApCmBgYAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKYGBge3J9CnRlbXAyICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGU9PSJBIikgJT4lIAogICNmaWx0ZXIocmVsX3lfb3RoZXIgPiAtMjAgJiByZWxfeV9vdGhlciA8IDIwKSAlPiUgCiAgI2ZpbHRlcihyZWxfeF9vdGhlciA+IC0yMCAmIHJlbF94X290aGVyIDwgMjApICU+JSAKICBnZ3Bsb3QoYWVzKHg9cmVsX3hfb3RoZXIseT1yZWxfeV9vdGhlcikpICsKICBnZW9tX3BvaW50KCkKYGBgCgoKCgoKCmBgYHtyfQp0ZW1wMiAlPiUgCiAgZmlsdGVyKGdlbm90eXBlPT0iQSIpICU+JSAKICAjZmlsdGVyKHJlbF95X290aGVyID4gLTIwICYgcmVsX3lfb3RoZXIgPCAyMCkgJT4lIAogICNmaWx0ZXIocmVsX3hfb3RoZXIgPiAtMjAgJiByZWxfeF9vdGhlciA8IDIwKSAlPiUgCiAgZ2dwbG90KGFlcyh4PXJlbF94X2Fic19vdGhlcix5PXJlbF95X290aGVyKSkgKwogIGdlb21fcG9pbnQoKSArCiAgY29vcmRfZml4ZWQoKQpgYGAKCgoKYGBge3J9CnRlbXAyICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGU9PSJBIikgJT4lIAogICNmaWx0ZXIocmVsX3lfb3RoZXIgPiAtMjAgJiByZWxfeV9vdGhlciA8IDIwKSAlPiUgCiAgI2ZpbHRlcihyZWxfeF9vdGhlciA+IC0yMCAmIHJlbF94X290aGVyIDwgMjApICU+JSAKICBnZ3Bsb3QoYWVzKHg9cmVsX3hfYWJzX2NvcnJfb3RoZXIseT1yZWxfeV9vdGhlcikpICsKICBnZW9tX3BvaW50KCkgKwogIGNvb3JkX2ZpeGVkKCkKYGBgCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE4LCBmaWcuaGVpZ2h0PTE4fQp0ZW1wMiAlPiUgCiAgZmlsdGVyKGdlbm90eXBlPT0iQSIpICU+JQogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBnZ3Bsb3QoYWVzKHg9cmVsX3hfYWJzX2NvcnJfb3RoZXIseT1yZWxfeV9vdGhlcikpICsKICBnZW9tX2JpbjJkKGJpbnMgPSBjKDEwMCwxMDApKSArCiAgeGxpbSgtMjAsMjApICsKICB5bGltKC0yMCwyMCkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDAsMTAwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgIyB0aGVtZV92b2lkKCkgKwogIGNvb3JkX2ZpeGVkKCkKYGBgCgoKCmBgYHtyfQp0ZW1wMiAlPiUgCiAgZmlsdGVyKGdlbm90eXBlIT0iQ1MgZmVtYWxlIikgJT4lCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogICNmaWx0ZXIocmVsX3lfb3RoZXIgPiAtMjAgJiByZWxfeV9vdGhlciA8IDIwKSAlPiUgCiAgI2ZpbHRlcihyZWxfeF9vdGhlciA+IC0yMCAmIHJlbF94X290aGVyIDwgMjApICU+JSAKICBnZ3Bsb3QoYWVzKHg9cmVsX3hfb3RoZXIseT1yZWxfeV9vdGhlcikpICsKICBnZW9tX2JpbjJkKGJpbnMgPSBjKDEwMCwxMDApKSArCiAgIyB4bGltKDAsMipwaSkgKwogICMgeWxpbSgwLDEwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoMCwxMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICMrCiAgIyB0aGVtZV92b2lkKCkgKwogICNjb29yZF9maXhlZCgpCmBgYAoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD04fQpwMSA8LSB0ZW1wMiAlPiUgCiAgZmlsdGVyKGdlbm90eXBlIT0iQ1MgZmVtYWxlIikgJT4lCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihyZWxfeV9vdGhlciA+IC0yMCAmIHJlbF95X290aGVyIDwgMjApICU+JSAKICBmaWx0ZXIocmVsX3hfb3RoZXIgPiAtMjAgJiByZWxfeF9vdGhlciA8IDIwKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWlmZWxzZShyZWxfeF9vdGhlcj49MCxyZWxfeF9vdGhlciwtcmVsX3hfb3RoZXIpLHk9cmVsX3lfb3RoZXIpKSArCiAgZ2VvbV9iaW4yZChiaW5zID0gYygxMDAsMTAwKSkgKwogIHhsaW0oLTIwLDIwKSArCiAgeWxpbSgtMjAsMjApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygwLDEwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogICMgdGhlbWVfdm9pZCgpICsKICBjb29yZF9maXhlZCgpCnAyIDwtIHRlbXAyICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUhPSJDUyBmZW1hbGUiKSAlPiUKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKHJlbF95X290aGVyID4gLTIwICYgcmVsX3lfb3RoZXIgPCAyMCkgJT4lIAogIGZpbHRlcihyZWxfeF9vdGhlciA+IC0yMCAmIHJlbF94X290aGVyIDwgMjApICU+JSAKICBnZ3Bsb3QoYWVzKHg9ZmFjaW5nX2FuZ2xlX19yYWQsIHk9ZGlzdF90b19vdGhlcl9fbW0pKSArCiAgZ2VvbV9iaW4yZChiaW5zID0gYygxNTAsNTApKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsMjApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygwLDEwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogICMgdGhlbWVfdm9pZCgpICsKICBjb29yZF9wb2xhcigpCgpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyKSwKICAgICAgICAgIGxhYmVscyA9IGMoInJlbCBwb3MiLCJwb2xhciIpLAogICAgICAgICAgaGp1c3QgPSAtMC4yLAogICAgICAgICAgbmNvbCA9IDIsCiAgICAgICAgICBucm93ID0gMSkKCgpgYGAKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9OH0KcDEgPC0gdGVtcDIgJT4lIAogIGZpbHRlcihnZW5vdHlwZSE9IkNTIGZlbWFsZSIpICU+JQogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIocmVsX3lfb3RoZXIgPiAtMjAgJiByZWxfeV9vdGhlciA8IDIwKSAlPiUgCiAgZmlsdGVyKHJlbF94X290aGVyID4gLTIwICYgcmVsX3hfb3RoZXIgPCAyMCkgJT4lIAogIGdncGxvdChhZXMoeD1yZWxfeF9hYnNfb3RoZXIseT1yZWxfeV9vdGhlcikpICsKICBnZW9tX2JpbjJkKGJpbnMgPSBjKDEwMCwxMDApKSArCiAgeGxpbSgtMjAsMjApICsKICB5bGltKC0yMCwyMCkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDAsMTAwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgIyB0aGVtZV92b2lkKCkgKwogIGNvb3JkX2ZpeGVkKCkKcDIgPC0gdGVtcDIgJT4lIAogIGZpbHRlcihnZW5vdHlwZSE9IkNTIGZlbWFsZSIpICU+JQogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIocmVsX3lfb3RoZXIgPiAtMjAgJiByZWxfeV9vdGhlciA8IDIwKSAlPiUgCiAgZmlsdGVyKHJlbF94X290aGVyID4gLTIwICYgcmVsX3hfb3RoZXIgPCAyMCkgJT4lIAogIGdncGxvdChhZXMoeD1mYWNpbmdfYW5nbGVfX3JhZCwgeT1kaXN0X3RvX290aGVyX19tbSkpICsKICBnZW9tX2JpbjJkKGJpbnMgPSBjKDE1MCw1MCkpICsKICB4bGltKDAsMipwaSkgKwogIHlsaW0oMCwyMCkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDAsMTAwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgIyB0aGVtZV92b2lkKCkgKwogIGNvb3JkX3BvbGFyKCkKCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIpLAogICAgICAgICAgbGFiZWxzID0gYygiYWJzIHJlbCBwb3MiLCJwb2xhciIpLAogICAgICAgICAgaGp1c3QgPSAtMC4yLAogICAgICAgICAgbmNvbCA9IDIsCiAgICAgICAgICBucm93ID0gMSkKCgpgYGAKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTh9CnAxIDwtIHRlbXAyICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUhPSJDUyBmZW1hbGUiKSAlPiUKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKHJlbF95X290aGVyID4gLTIwICYgcmVsX3lfb3RoZXIgPCAyMCkgJT4lIAogIGZpbHRlcihyZWxfeF9vdGhlciA+IC0yMCAmIHJlbF94X290aGVyIDwgMjApICU+JSAKICBnZ3Bsb3QoYWVzKHg9cmVsX3hfYWJzX2NvcnJfb3RoZXIseT1yZWxfeV9vdGhlcikpICsKICBnZW9tX2JpbjJkKGJpbnMgPSBjKDEwMCwxMDApKSArCiAgeGxpbSgtMjAsMjApICsKICB5bGltKC0yMCwyMCkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDAsMTAwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgIyB0aGVtZV92b2lkKCkgKwogIGNvb3JkX2ZpeGVkKCkKcDIgPC0gdGVtcDIgJT4lIAogIGZpbHRlcihnZW5vdHlwZSE9IkNTIGZlbWFsZSIpICU+JQogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIocmVsX3lfb3RoZXIgPiAtMjAgJiByZWxfeV9vdGhlciA8IDIwKSAlPiUgCiAgZmlsdGVyKHJlbF94X290aGVyID4gLTIwICYgcmVsX3hfb3RoZXIgPCAyMCkgJT4lIAogIGdncGxvdChhZXMoeD1mYWNpbmdfYW5nbGVfX3JhZCwgeT1kaXN0X3RvX290aGVyX19tbSkpICsKICBnZW9tX2JpbjJkKGJpbnMgPSBjKDE1MCw1MCkpICsKICB4bGltKDAsMipwaSkgKwogIHlsaW0oMCwyMCkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDAsMTAwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgIyB0aGVtZV92b2lkKCkgKwogIGNvb3JkX3BvbGFyKCkKCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIpLAogICAgICAgICAgbGFiZWxzID0gYygiYWJzIHJlbCBwb3MiLCJwb2xhciIpLAogICAgICAgICAgaGp1c3QgPSAtMC4yLAogICAgICAgICAgbmNvbCA9IDIsCiAgICAgICAgICBucm93ID0gMSkKCgpgYGAKCgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTgsIGZpZy5oZWlnaHQ9MTh9CnRlbXAyICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGU9PSJDUyBmZW1hbGUiKSAlPiUKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZ2dwbG90KGFlcyh4PXJlbF94X2Fic19jb3JyX290aGVyLHk9cmVsX3lfb3RoZXIpKSArCiAgZ2VvbV9iaW4yZChiaW5zID0gYygxMDAsMTAwKSkgKwogIHhsaW0oLTIwLDIwKSArCiAgeWxpbSgtMjAsMjApICsgCiAgIyBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDAsNTAwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgIyB0aGVtZV92b2lkKCkgKwogIGNvb3JkX2ZpeGVkKCkKYGBgCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MTJ9CnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoc2V4PT0iZmVtYWxlIikgJT4lCiAgZmlsdGVyKHRyZWF0bWVudD09IkEiKSAlPiUKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZ2dwbG90KGFlcyh4PXJlbF94X2Fic19jb3JyX290aGVyLHk9cmVsX3lfb3RoZXIpKSArCiAgZ2VvbV9iaW4yZChiaW5zID0gYygxMDAsMTAwKSkgKwogIHhsaW0oLTIwLDIwKSArCiAgeWxpbSgtMjAsMjApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygwLDUwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogICMgdGhlbWVfdm9pZCgpICsKICBjb29yZF9maXhlZCgpCgpwMiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKHNleD09ImZlbWFsZSIpICU+JQogIGZpbHRlcih0cmVhdG1lbnQ9PSJCIikgJT4lCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGdncGxvdChhZXMoeD1yZWxfeF9hYnNfY29ycl9vdGhlcix5PXJlbF95X290aGVyKSkgKwogIGdlb21fYmluMmQoYmlucyA9IGMoMTAwLDEwMCkpICsKICB4bGltKC0yMCwyMCkgKwogIHlsaW0oLTIwLDIwKSArIAogICMgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbmEudmFsdWUgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygwLDUwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogICMgdGhlbWVfdm9pZCgpICsKICBjb29yZF9maXhlZCgpCgpwMyA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKHNleD09ImZlbWFsZSIpICU+JQogIGZpbHRlcih0cmVhdG1lbnQ9PSJDIikgJT4lCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGdncGxvdChhZXMoeD1yZWxfeF9hYnNfY29ycl9vdGhlcix5PXJlbF95X290aGVyKSkgKwogIGdlb21fYmluMmQoYmlucyA9IGMoMTAwLDEwMCkpICsKICB4bGltKC0yMCwyMCkgKwogIHlsaW0oLTIwLDIwKSArIAogICMgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbmEudmFsdWUgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygwLDUwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogICMgdGhlbWVfdm9pZCgpICsKICBjb29yZF9maXhlZCgpCgpwNCA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKHNleD09ImZlbWFsZSIpICU+JQogIGZpbHRlcih0cmVhdG1lbnQ9PSJEIikgJT4lCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGdncGxvdChhZXMoeD1yZWxfeF9hYnNfY29ycl9vdGhlcix5PXJlbF95X290aGVyKSkgKwogIGdlb21fYmluMmQoYmlucyA9IGMoMTAwLDEwMCkpICsKICB4bGltKC0yMCwyMCkgKwogIHlsaW0oLTIwLDIwKSArIAogICMgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbmEudmFsdWUgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygwLDUwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogICMgdGhlbWVfdm9pZCgpICsKICBjb29yZF9maXhlZCgpCgpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyLHAzLHA0KSwKICAgICAgICAgIGxhYmVscyA9IGMoIkEiLCJCIiwiQyIsIkQiKSwKICAgICAgICAgICNoanVzdCA9IDEsCiAgICAgICAgICBuY29sID0gMiwKICAgICAgICAgIG5yb3cgPSAyKQoKYGBgCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0xMn0KcDEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihzZXg9PSJmZW1hbGUiKSAlPiUKICBmaWx0ZXIodHJlYXRtZW50PT0iQSIpICU+JQogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIuNSkgJT4lIAogIGdncGxvdChhZXMoeD1yZWxfeF9hYnNfY29ycl9vdGhlcix5PXJlbF95X290aGVyKSkgKwogIGdlb21fYmluMmQoYmlucyA9IGMoMTAwLDEwMCkpICsKICB4bGltKC0yMCwyMCkgKwogIHlsaW0oLTIwLDIwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoMiwyMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICB0aGVtZV92b2lkKCkgKwogIGNvb3JkX2ZpeGVkKCkKCnAyIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoc2V4PT0iZmVtYWxlIikgJT4lCiAgZmlsdGVyKHRyZWF0bWVudD09IkIiKSAlPiUKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyLjUpICU+JSAKICBnZ3Bsb3QoYWVzKHg9cmVsX3hfYWJzX2NvcnJfb3RoZXIseT1yZWxfeV9vdGhlcikpICsKICBnZW9tX2JpbjJkKGJpbnMgPSBjKDEwMCwxMDApKSArCiAgeGxpbSgtMjAsMjApICsKICB5bGltKC0yMCwyMCkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDIsMjAwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgdGhlbWVfdm9pZCgpICsKICBjb29yZF9maXhlZCgpCgpwMyA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKHNleD09ImZlbWFsZSIpICU+JQogIGZpbHRlcih0cmVhdG1lbnQ9PSJDIikgJT4lCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMi41KSAlPiUgCiAgZ2dwbG90KGFlcyh4PXJlbF94X2Fic19jb3JyX290aGVyLHk9cmVsX3lfb3RoZXIpKSArCiAgZ2VvbV9iaW4yZChiaW5zID0gYygxMDAsMTAwKSkgKwogIHhsaW0oLTIwLDIwKSArCiAgeWxpbSgtMjAsMjApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygyLDIwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgY29vcmRfZml4ZWQoKQoKcDQgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihzZXg9PSJmZW1hbGUiKSAlPiUKICBmaWx0ZXIodHJlYXRtZW50PT0iRCIpICU+JQogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIuNSkgJT4lIAogIGdncGxvdChhZXMoeD1yZWxfeF9hYnNfY29ycl9vdGhlcix5PXJlbF95X290aGVyKSkgKwogIGdlb21fYmluMmQoYmlucyA9IGMoMTAwLDEwMCkpICsKICB4bGltKC0yMCwyMCkgKwogIHlsaW0oLTIwLDIwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoMiwyMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICB0aGVtZV92b2lkKCkgKwogIGNvb3JkX2ZpeGVkKCkKCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIscDMscDQpLAogICAgICAgICAgbGFiZWxzID0gYygiQSIsIkIiLCJDIiwiRCIpLAogICAgICAgICAgI2hqdXN0ID0gMSwKICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgbnJvdyA9IDIpCgpgYGAKCgoKCgoKCgoKCiMjIyMgUHJvcG9ydGlvbiB0aW1lIGluIHNlY3RvciBhbmQgd2l0aGluIDEwbW0KCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD04fQpwMSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKHNleCA9PSAiZmVtYWxlIikgJT4lIAogIGZpbHRlcighaXMubmEodHJlYXRtZW50KSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIuNSkgJT4lIAogICNmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoY291bnRzID0gMTAwKnN1bShmYWNpbmdfYW5nbGVfX3JhZD49MCAmIGZhY2luZ19hbmdsZV9fcmFkIDwgMSpwaS84KS9sZW5ndGgoRnJhbWUpLAogICAgICAgICAgICB0cmVhdG1lbnQgPSB1bmlxdWUodHJlYXRtZW50KSkgJT4lIAogIGdncGxvdChhZXMoeD10cmVhdG1lbnQsIHk9Y291bnRzKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgIysKICAgICN5bGltKDAscGkvNikKcDIgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihzZXggPT0gImZlbWFsZSIpICU+JSAKICBmaWx0ZXIoIWlzLm5hKHRyZWF0bWVudCkpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyLjUpICU+JSAKICAjZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGNvdW50cyA9IDEwMCpzdW0oZmFjaW5nX2FuZ2xlX19yYWQ+PTEqcGkvOCAmIGZhY2luZ19hbmdsZV9fcmFkIDwgMipwaS84KS9sZW5ndGgoRnJhbWUpLAogICAgICAgICAgICB0cmVhdG1lbnQgPSB1bmlxdWUodHJlYXRtZW50KSkgJT4lIAogIGdncGxvdChhZXMoeD10cmVhdG1lbnQsIHk9Y291bnRzKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgIysKICAgICN5bGltKDAscGkvNikKcDMgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihzZXggPT0gImZlbWFsZSIpICU+JSAKICBmaWx0ZXIoIWlzLm5hKHRyZWF0bWVudCkpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyLjUpICU+JSAKICAjZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGNvdW50cyA9IDEwMCpzdW0oZmFjaW5nX2FuZ2xlX19yYWQ+PTIqcGkvOCAmIGZhY2luZ19hbmdsZV9fcmFkIDwgMypwaS84KS9sZW5ndGgoRnJhbWUpLAogICAgICAgICAgICB0cmVhdG1lbnQgPSB1bmlxdWUodHJlYXRtZW50KSkgJT4lIAogIGdncGxvdChhZXMoeD10cmVhdG1lbnQsIHk9Y291bnRzKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgIysKICAgICN5bGltKDAscGkvNikKcDQgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihzZXggPT0gImZlbWFsZSIpICU+JSAKICBmaWx0ZXIoIWlzLm5hKHRyZWF0bWVudCkpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyLjUpICU+JSAKICAjZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGNvdW50cyA9IDEwMCpzdW0oZmFjaW5nX2FuZ2xlX19yYWQ+PTMqcGkvOCAmIGZhY2luZ19hbmdsZV9fcmFkIDwgNCpwaS84KS9sZW5ndGgoRnJhbWUpLAogICAgICAgICAgICB0cmVhdG1lbnQgPSB1bmlxdWUodHJlYXRtZW50KSkgJT4lIAogIGdncGxvdChhZXMoeD10cmVhdG1lbnQsIHk9Y291bnRzKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgIysKICAgICN5bGltKDAscGkvNikKcDUgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihzZXggPT0gImZlbWFsZSIpICU+JSAKICBmaWx0ZXIoIWlzLm5hKHRyZWF0bWVudCkpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyLjUpICU+JSAKICAjZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGNvdW50cyA9IDEwMCpzdW0oZmFjaW5nX2FuZ2xlX19yYWQ+PTQqcGkvOCAmIGZhY2luZ19hbmdsZV9fcmFkIDwgNSpwaS84KS9sZW5ndGgoRnJhbWUpLAogICAgICAgICAgICB0cmVhdG1lbnQgPSB1bmlxdWUodHJlYXRtZW50KSkgJT4lIAogIGdncGxvdChhZXMoeD10cmVhdG1lbnQsIHk9Y291bnRzKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgIysKICAgICN5bGltKDAscGkvNikKcDYgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihzZXggPT0gImZlbWFsZSIpICU+JSAKICBmaWx0ZXIoIWlzLm5hKHRyZWF0bWVudCkpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyLjUpICU+JSAKICAjZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGNvdW50cyA9IDEwMCpzdW0oZmFjaW5nX2FuZ2xlX19yYWQ+PTUqcGkvOCAmIGZhY2luZ19hbmdsZV9fcmFkIDwgNipwaS84KS9sZW5ndGgoRnJhbWUpLAogICAgICAgICAgICB0cmVhdG1lbnQgPSB1bmlxdWUodHJlYXRtZW50KSkgJT4lIAogIGdncGxvdChhZXMoeD10cmVhdG1lbnQsIHk9Y291bnRzKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgIysKICAgICN5bGltKDAscGkvNikKcDcgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihzZXggPT0gImZlbWFsZSIpICU+JSAKICBmaWx0ZXIoIWlzLm5hKHRyZWF0bWVudCkpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyLjUpICU+JSAKICAjZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGNvdW50cyA9IDEwMCpzdW0oZmFjaW5nX2FuZ2xlX19yYWQ+PTYqcGkvOCAmIGZhY2luZ19hbmdsZV9fcmFkIDwgNypwaS84KS9sZW5ndGgoRnJhbWUpLAogICAgICAgICAgICB0cmVhdG1lbnQgPSB1bmlxdWUodHJlYXRtZW50KSkgJT4lIAogIGdncGxvdChhZXMoeD10cmVhdG1lbnQsIHk9Y291bnRzKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgIysKICAgICN5bGltKDAscGkvNikKcDggPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihzZXggPT0gImZlbWFsZSIpICU+JSAKICBmaWx0ZXIoIWlzLm5hKHRyZWF0bWVudCkpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyLjUpICU+JSAKICAjZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGNvdW50cyA9IDEwMCpzdW0oZmFjaW5nX2FuZ2xlX19yYWQ+PTcqcGkvOCAmIGZhY2luZ19hbmdsZV9fcmFkIDwgOCpwaS84KS9sZW5ndGgoRnJhbWUpLAogICAgICAgICAgICB0cmVhdG1lbnQgPSB1bmlxdWUodHJlYXRtZW50KSkgJT4lIAogIGdncGxvdChhZXMoeD10cmVhdG1lbnQsIHk9Y291bnRzKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgIysKICAgICN5bGltKDAscGkvNikKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMixwMyxwNCxwNSxwNixwNyxwOCksCiAgICAgICAgICBsYWJlbHMgPSBjKCIwLXBpLzgiLCJwaS84LTJwaS84IiwiMnBpLzgtM3BpLzgiLAogICAgICAgICAgICAgICAgICAgICAiM3BpLzgtNHBpLzgiLCI0cGkvOC01cGkvOCIsIjVwaS84LTZwaS84IiwKICAgICAgICAgICAgICAgICAgICAgIjZwaS84LTdwaS84IiwiN3BpLzgtcGkiKSwKICAgICAgICAgICNoanVzdCA9IC0xLjQsCiAgICAgICAgICAjdmp1c3QgPSAyLAogICAgICAgICAgbmNvbCA9IDQsCiAgICAgICAgICBucm93ID0gMikKCmBgYAoKCgoKCgoKCiMjIyMgUHJvcG9ydGlvbiB0aW1lIGluIHNlY3RvciBhbmQgd2l0aGluIDEwbW0KCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD02fQpwMSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKHNleCA9PSAiZmVtYWxlIikgJT4lIAogIGZpbHRlcighaXMubmEodHJlYXRtZW50KSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIuNSkgJT4lIAogICNmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoY291bnRzID0gMTAwKnN1bShmYWNpbmdfYW5nbGVfX3JhZD49MCAmIGZhY2luZ19hbmdsZV9fcmFkIDwgMypwaS80KS9sZW5ndGgoRnJhbWUpLAogICAgICAgICAgICB0cmVhdG1lbnQgPSB1bmlxdWUodHJlYXRtZW50KSkgJT4lIAogIGdncGxvdChhZXMoeD10cmVhdG1lbnQsIHk9Y291bnRzKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgIysKICAgICN5bGltKDAscGkvNikKcDIgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihzZXggPT0gImZlbWFsZSIpICU+JSAKICBmaWx0ZXIoIWlzLm5hKHRyZWF0bWVudCkpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyLjUpICU+JSAKICAjZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGNvdW50cyA9IDEwMCpzdW0oZmFjaW5nX2FuZ2xlX19yYWQ+PTMqcGkvNCAmIGZhY2luZ19hbmdsZV9fcmFkIDwgcGkpL2xlbmd0aChGcmFtZSksCiAgICAgICAgICAgIHRyZWF0bWVudCA9IHVuaXF1ZSh0cmVhdG1lbnQpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PXRyZWF0bWVudCwgeT1jb3VudHMpKSArCiAgICBnZW9tX2JveHBsb3QoKSAjKwogICAgI3lsaW0oMCxwaS82KQoKCgpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyKSwKICAgICAgICAgIGxhYmVscyA9IGMoIjAtM3BpLzQiLCIzcGkvNC1waSIpLAogICAgICAgICAgI2hqdXN0ID0gLTEuNCwKICAgICAgICAgICN2anVzdCA9IDIsCiAgICAgICAgICBuY29sID0gMiwKICAgICAgICAgIG5yb3cgPSAxKQoKYGBgCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihGaWxlTmFtZSA9PSAiTWVnYW4tMjAxOV8wM18wNl9Db3VydHNoaXAtRHN4VmdsdXRUTlRfTWFsZV8xMjM0XzIiKSAlPiUgCiAgZmlsdGVyKElkID09IDM1KSAlPiUKICBtdXRhdGUocm9sbGF2Z19kaXN0X3RvX290aGVyID0gcm9sbG1lYW4oZGlzdF90b19vdGhlcl9fbW0sIDIwMCwgZmlsbCA9IGMoTkEsMCxOQSksIGFsaWduID0gYygiY2VudGVyIikpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT1kaXN0X3RvX290aGVyX19tbSxjb2xvcj1nZ19jb2xvcl9odWUoMilbMV0pKSsKICAgIGdlb21fcG9pbnQoYWVzKHk9cm9sbGF2Z19kaXN0X3RvX290aGVyLGNvbG9yPWdnX2NvbG9yX2h1ZSgyKVsyXSksc2l6ZT0xKQpgYGAKCgoKPGJyLz4KPGJyLz4KCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMzcpICU+JQogIG11dGF0ZShyb2xsYXZnX2Rpc3RfdG9fb3RoZXIgPSByb2xsbWVhbihkaXN0X3RvX290aGVyX19tbSwgMjAwLCBmaWxsID0gYyhOQSwwLE5BKSwgYWxpZ24gPSBjKCJjZW50ZXIiKSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9RnJhbWUpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PWRpc3RfdG9fb3RoZXJfX21tLGNvbG9yPWdnX2NvbG9yX2h1ZSgyKVsxXSkpKwogICAgZ2VvbV9wb2ludChhZXMoeT1yb2xsYXZnX2Rpc3RfdG9fb3RoZXIsY29sb3I9Z2dfY29sb3JfaHVlKDIpWzJdKSxzaXplPTEpCmBgYAoKCgoKCgoKPGJyLz4KPGJyLz4KCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfNiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMTcpICU+JQogIG11dGF0ZShyb2xsYXZnX2Rpc3RfdG9fb3RoZXIgPSByb2xsbWVhbihkaXN0X3RvX290aGVyX19tbSwgMjAwLCBmaWxsID0gYyhOQSwwLE5BKSwgYWxpZ24gPSBjKCJjZW50ZXIiKSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9RnJhbWUpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PWRpc3RfdG9fb3RoZXJfX21tLGNvbG9yPWdnX2NvbG9yX2h1ZSgyKVsxXSkpKwogICAgZ2VvbV9wb2ludChhZXMoeT1yb2xsYXZnX2Rpc3RfdG9fb3RoZXIsY29sb3I9Z2dfY29sb3JfaHVlKDIpWzJdKSxzaXplPTEpKwogICAgZ2VvbV9wb2ludChhZXMoeT1jKGlmZWxzZShTbW9vdGhlZENvcHVsYXRpb249PTEsU21vb3RoZWRDb3B1bGF0aW9uKzYsTkEpKSkpKwogICAgZ2VvbV9wb2ludChhZXMoeT1jKGlmZWxzZShDb3B1bGF0aW9uPT0xLENvcHVsYXRpb24rNyxOQSkpKSkKYGBgCgoKCmNvbG91cj1jKGlmZWxzZShyb2xsYXZnX2Rpc3RfdG9fb3RoZXI+Mi41LGdnX2NvbG9yX2h1ZSgyKVsyXSxnZ19jb2xvcl9odWUoMilbMV0pKQoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihGaWxlTmFtZSA9PSAiTWVnYW4tMjAxOV8wM18wNl9Db3VydHNoaXAtRHN4VmdsdXRUTlRfTWFsZV8xMjM0XzYiKSAlPiUgCiAgZmlsdGVyKElkID09IDE3KSAlPiUKICBtdXRhdGUocm9sbGF2Z19kaXN0X3RvX290aGVyID0gcm9sbG1lYW4oZGlzdF90b19vdGhlcl9fbW0sIDIwMCwgZmlsbCA9IGMoTkEsMCxOQSksIGFsaWduID0gYygiY2VudGVyIikpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT1kaXN0X3RvX290aGVyX19tbSxjb2xvcj1nZ19jb2xvcl9odWUoMilbMV0pKSsKICAgIGdlb21fcG9pbnQoYWVzKHk9cm9sbGF2Z19kaXN0X3RvX290aGVyLGNvbG91cj1jKGlmZWxzZShyb2xsYXZnX2Rpc3RfdG9fb3RoZXI+Mi41LGdnX2NvbG9yX2h1ZSgyKVsyXSxnZ19jb2xvcl9odWUoMilbMV0pKSksc2l6ZT0xKSsKICAgIGdlb21fcG9pbnQoYWVzKHk9YyhpZmVsc2UoU21vb3RoZWRDb3B1bGF0aW9uPT0xLFNtb290aGVkQ29wdWxhdGlvbis2LE5BKSkpKSsKICAgIGdlb21fcG9pbnQoYWVzKHk9YyhpZmVsc2UoQ29wdWxhdGlvbj09MSxDb3B1bGF0aW9uKzcsTkEpKSkpCmBgYAoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoRmlsZU5hbWUgPT0gIk1lZ2FuLTIwMTlfMDNfMDZfQ291cnRzaGlwLURzeFZnbHV0VE5UX01hbGVfMTIzNF8yIikgJT4lIAogIGZpbHRlcihJZCA9PSAzNykgJT4lCiAgbXV0YXRlKHJvbGxhdmdfZGlzdF90b19vdGhlciA9IHJvbGxtZWFuKGRpc3RfdG9fb3RoZXJfX21tLCAyMDAsIGZpbGwgPSBjKE5BLDAsTkEpLCBhbGlnbiA9IGMoImNlbnRlciIpKSkgJT4lIAogIGdncGxvdChhZXMoeD1GcmFtZSkpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9ZGlzdF90b19vdGhlcl9fbW0sY29sb3I9Z2dfY29sb3JfaHVlKDIpWzFdKSkrCiAgICBnZW9tX3BvaW50KGFlcyh5PXJvbGxhdmdfZGlzdF90b19vdGhlcixjb2xvdXI9YyhpZmVsc2Uocm9sbGF2Z19kaXN0X3RvX290aGVyPjIuNSxnZ19jb2xvcl9odWUoMilbMl0sZ2dfY29sb3JfaHVlKDIpWzFdKSkpLHNpemU9MSkKYGBgCgoKCgoKCgogIAoKCgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoRmlsZU5hbWUgPT0gIk1lZ2FuLTIwMTlfMDNfMDZfQ291cnRzaGlwLURzeFZnbHV0VE5UX01hbGVfMTIzNF8yIikgJT4lIAogIGZpbHRlcihJZCA9PSAyNykgJT4lIAogIG11dGF0ZShyb2xsYXZnX2Rpc3RfdG9fb3RoZXIgPSByb2xsbWVhbihkaXN0X3RvX290aGVyX19tbSwgMjAwLCBmaWxsID0gYyhOQSwwLE5BKSwgYWxpZ24gPSBjKCJjZW50ZXIiKSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9RnJhbWUpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PWRpc3RfdG9fb3RoZXJfX21tLGNvbG9yPWdnX2NvbG9yX2h1ZSgyKVsxXSkpKwogICAgZ2VvbV9wb2ludChhZXMoeT1yb2xsYXZnX2Rpc3RfdG9fb3RoZXIsY29sb3VyPWMoaWZlbHNlKHJvbGxhdmdfZGlzdF90b19vdGhlcj4yLjUsZ2dfY29sb3JfaHVlKDIpWzJdLGdnX2NvbG9yX2h1ZSgyKVsxXSkpKSxzaXplPTEpICsKICAgIHlsaW0oMCwyMCkKYGBgCgoKCgoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfNiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMTcpICU+JQogIG11dGF0ZShyb2xsYXZnX2Rpc3RfdG9fb3RoZXIgPSByb2xsbWVhbihkaXN0X3RvX290aGVyX19tbSwgMjAwLCBmaWxsID0gYyhOQSwwLE5BKSwgYWxpZ24gPSBjKCJjZW50ZXIiKSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9RnJhbWUpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PWRpc3RfdG9fb3RoZXJfX21tLGNvbG9yPWdnX2NvbG9yX2h1ZSgyKVsxXSkpKwogICAgZ2VvbV9wb2ludChhZXMoeT1yb2xsYXZnX2Rpc3RfdG9fb3RoZXIsY29sb3VyPWMoaWZlbHNlKHJvbGxhdmdfZGlzdF90b19vdGhlcj4yLjUsZ2dfY29sb3JfaHVlKDIpWzJdLGdnX2NvbG9yX2h1ZSgyKVsxXSkpKSxzaXplPTEpICsKICAgIHlsaW0oMCwyMCkKYGBgCgoKCgoKCgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihGaWxlTmFtZSA9PSAiTWVnYW4tMjAxOV8wM18wNl9Db3VydHNoaXAtRHN4VmdsdXRUTlRfTWFsZV8xMjM0XzIiKSAlPiUgCiAgZmlsdGVyKElkID09IDI5KSAlPiUgCiAgbXV0YXRlKHJvbGxhdmdfZGlzdF90b19vdGhlciA9IHJvbGxtZWFuKGRpc3RfdG9fb3RoZXJfX21tLCAyMDAsIGZpbGwgPSBjKE5BLDAsTkEpLCBhbGlnbiA9IGMoImNlbnRlciIpKSkgJT4lIAogIGdncGxvdChhZXMoeD1GcmFtZSkpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9ZGlzdF90b19vdGhlcl9fbW0sY29sb3I9Z2dfY29sb3JfaHVlKDIpWzFdKSkrCiAgICBnZW9tX3BvaW50KGFlcyh5PXJvbGxhdmdfZGlzdF90b19vdGhlcixjb2xvdXI9YyhpZmVsc2Uocm9sbGF2Z19kaXN0X3RvX290aGVyPjIuNSxnZ19jb2xvcl9odWUoMilbMl0sZ2dfY29sb3JfaHVlKDIpWzFdKSkpLHNpemU9MSkgKwogICAgeWxpbSgwLDIwKQpgYGAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg==